// 联合类型表示一个变量可以是多个类型中的任意一个。
// 联合类型 Method：限定 HTTP 请求方法，既包含小写形式（如 'get'），也包含大写形式（如 'GET'）
export type Method = 'get' | 'GET'
  | 'delete' | 'Delete'
  | 'head' | 'HEAD'
  | 'options' | 'OPTIONS'
  | 'post' | 'POST'
  | 'put' | 'PUT'
  | 'patch' | 'PATCH'

// 请求配置规范
export interface AxiosRequestConfig {
  url?: string       // 请求的 URL 地址
  method?: Method // 指定 HTTP 请求方法
  data?: any   // 用于在发送请求时携带的数据
  params?: any  // 用于在 URL 中添加查询参数
  headers?: any
  responseType?: XMLHttpRequestResponseType
  timeout?: number
  transformRequest?: AxiosTransformer | AxiosTransformer[]// 请求数据转换函数
  transformResponse?: AxiosTransformer | AxiosTransformer[]
  cancelToken?: CancelToken// 取消令牌
  withCredentials?: boolean
  xsrfCookieName?: string
  xsrfHeaderName?: string
  onDownloadProgress?: (e: ProgressEvent) => void
  onUploadProgress?: (e: ProgressEvent) => void
  auth?: AxiosBasicCredentials
  validateStatus?: (status: number) => boolean
  paramsSerializer?: (params: any) => string
  baseIRL?: string

  [propName: string]: any// 允许添加自定义属性
}

// 响应结构规范
export interface AxiosResponse<T = any> {
  data: T
  status: number    // HTTP 状态码（如 200、404、500）
  statusText: string
  headers: any   // 响应头
  config: AxiosRequestConfig
  request: any
}

// 明确返回值是 Promise 类型，且解析后是 AxiosResponse类型
export interface AxiosPromise<T = any> extends Promise<AxiosResponse<T>> {

}

// 错误接口 AxiosError：自定义错误类型
export interface AxiosError extends Error { // 拥有原生错误的所有属性（如 message），并添加了 Axios 特有的信息（如 config、response）
  isAxiosError: boolean// 固定为 true，标识这是 Axios 专属错误
  config: AxiosRequestConfig// 出错时的请求配置
  code?: string | null
  request?: any// 未成功发送的请求对象
  response?: AxiosResponse
}

export interface Axios {
  defaults: AxiosRequestConfig// 默认配置（所有请求的基础配置，如默认超时时间、通用请求头）
  interceptors: {
    request: AxiosInterceptorManager<AxiosRequestConfig>// 请求拦截器  在请求发送前修改配置（如添加 Token）。
    response: AxiosInterceptorManager<AxiosResponse>// 响应拦截器   在响应接收后处理数据（如统一解析 data 字段）
  }

  request<T = any>(config: AxiosRequestConfig): AxiosPromise<T>

  get<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>

  delete<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>

  head<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>

  options<T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>

  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise<T>

  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise<T>

  patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise<T>

  getUri(config?: AxiosRequestConfig): string
}

// 让 Axios 实例可直接调用（像函数一样），扩展调用方式
export interface AxiosInstance extends Axios {
  <T = any>(config: AxiosRequestConfig): AxiosPromise<T>   // 方式 1：传配置对象

  <T = any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>  // 方式 2：传 url + 配置
}

export interface AxiosClassStatic {
  new(config: AxiosRequestConfig): Axios
}

// 静态接口 AxiosStatic（创建实例和取消相关）
export interface AxiosStatic extends AxiosInstance {
  create(config?: AxiosRequestConfig): AxiosInstance// 创建自定义配置的实例（如设置基础 URL

  CancelToken: CancelTokenStatic// 取消令牌的构造函数和静态方法
  Cancel: CancelStatic// 取消错误的构造函数
  isCancel: (value: any) => boolean// 判断是否是取消错误

  all<T>(promises: Array<T | Promise<T>>): Promise<T[]>

  spread<T, R>(callback: (...args: T[]) => R): (arr: T[]) => R

  Axios: AxiosClassStatic
}

// 管理拦截器的生命周期（添加、删除）
export interface AxiosInterceptorManager<T> {  // 即 InterceptorManager<T> 的具体实例
  use(resolved: ResolvedFn<T>, rejected?: RejectedFn): number// use 方法：添加拦截器，返回 ID

  eject(id: number): void// 通过 ID 删除拦截器

}

export interface ResolvedFn<T> {
  (val: T): T | Promise<T>   // 成功回调（ResolvedFn<T>），接收 T 类型数据，返回同类型或其 Promise
}

export interface RejectedFn {
  (error: any): any  // 失败回调（RejectedFn），接收错误对象，返回任意类型（用于处理错误）
}

// 数据转换函数 AxiosTransformer（处理请求 / 响应数据）
export interface AxiosTransformer {
  (data: any, headers?: any): any
}

// 请求取消相关接口（核心：取消令牌）
export interface CancelToken {
  promise: Promise<Cancel> // Promise，解析时表示请求已取消
  reason?: Cancel// 取消原因（Cancel 实例）

  throwIfRequested(): void
}

// 取消函数（调用时取消请求）
export interface Canceler {
  (message?: string): void
}

// 取消执行器（初始化取消逻辑）
export interface CancelExecutor {
  (cancel: Canceler): void
}

// 取消源（包含令牌和取消函数）
export interface CancelTokenSource {
  token: CancelToken
  cancel: Canceler
}

// 构造函数和静态方法类型
export interface CancelTokenStatic {
  new(executor: CancelExecutor): CancelToken// 创建 CancelToken 实例

  source(): CancelTokenSource// 生成取消源（常用方式）
}

// 取消错误对象（包含可选消息）
export interface Cancel {
  message?: string
}

export interface CancelStatic {
  new(message?: string): Cancel
}

export interface AxiosBasicCredentials {
  username: string
  password: string
}